package com.guoguo.leetcode.character;

/**
 * @Author guoguo
 * @desc [验证回文串]：使用双指针，一个向前，一个向后，遇到空格以及特殊字符跳过，然后判断。
 * leetcode地址:
 * <url>https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xne8id/</url>
 */
public class Palindrome {
    public static void main(String[] args) {
        System.out.println(isPalindromeFor("abccba"));
    }

    /**
     * for循环处理
     * @param s
     * @return
     */
    private static boolean isPalindromeFor(String s) {
       if(s.length() == 0){
           return true;
       }
       for(int left=0,right=s.length() - 1; left < right; left++,right--){
            // 只考虑字母和数字，所以不是字母和数字的先过滤掉。
           while(left<right && !Character.isLetterOrDigit(s.charAt(left))){
               left++;
           }
           while(left<right && !Character.isLetterOrDigit(s.charAt(right))){
               right--;
           }
           // 把两个字符转为小写，再判断是否一样，如果不一样，直接返回false
           if(Character.toLowerCase(s.charAt(left)) != Character.toLowerCase(s.charAt(right))){
               return false;
           }
       }
       return true;
    }

    /**
     * 递归处理
     */
    private static boolean isPalindromeRecursion(String s){
        return isPalindRomeHelper(s, 0, s.length() - 1);
    }

    private static boolean isPalindRomeHelper(String s, int left, int right) {
        if(left >= right){
            return true;
        }
        while(left < right && !Character.isLetterOrDigit(s.charAt(left))){
            left++;
        }
        while(left < right && !Character.isLetterOrDigit(s.charAt(right))){
            right--;
        }
        return Character.toLowerCase(s.charAt(left)) == Character.toLowerCase(s.charAt(right))
                && isPalindRomeHelper(s, ++left, --right);
    }


}
